package com.upbos.upm.dept;

import com.upbos.data.core.SingleDao;
import com.upbos.data.persistence.Where;
import com.upbos.upm.entity.Dept;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.List;

/**
 * <b>Application name：</b> DeptController.java <br>
 * <b>Application describing：部门管理Dao </b> <br>
 * <b>Copyright：</b> Copyright &copy; 2019 upbos.com 版权所有。<br>
 * <b>Company：</b> upbos.com <br>
 * <b>@Date：</b> 2019年11月08日 13:59 <br>
 * <b>@author：</b> <a href="mailto:Jason@miyzh.com"> Jason </a> <br>
 * <b>@version：</b>V5.1.0 <br>
 */
@Repository
public class DeptDao {

    /**
     * orm 操作类
     */
    @Resource
    private SingleDao singleDao;

    /**
     * 查询下级部门
     *
     * @param parentId 上级部门Id
     * @return 下级部门列表
     */
    public List<Dept> listDeptByParentId(String parentId) {
        Dept dept = new Dept();
        dept.setParentId(parentId);
        return singleDao.queryList("DeptDaoMapper.listDeptByParentId", dept);
    }



    /**
     * 根据部门名称模糊查询
     *
     * @param name 部门名称
     * @return 部门列表
     */
    public List<Dept> listDept(String orgId, String name) {
        Dept dept = new Dept();
        dept.setOrgId(orgId);
        dept.setName(name);
        return singleDao.queryList("DeptDaoMapper.listDept", dept);
    }

    /**
     * 插入部门
     *
     * @param dept 部门
     */
    public void insertDept(Dept dept) {
        dept.setIsLeaf(true);
        singleDao.insert(dept);
    }

    /**
     * 更新部门
     *
     * @param dept 部门
     */
    public void updateDept(Dept dept) {
        singleDao.updateById(dept);
    }

    /**
     * 获取当前父节点下排序号最大的部门
     *
     * @param parentId
     * @return
     */
    public Dept getMaxDept(String parentId) {
        return singleDao.queryOne("DeptDaoMapper.getMaxDept", parentId);
    }

    /**
     * 获取上级节点的层级代码
     *
     * @param id 上级节点Id
     * @return 层级代码
     */
    public String getDeptCascade(String id) {
        String cascade = singleDao.queryOne("DeptDaoMapper.getDeptCascade", id);
        return cascade == null ? "" : cascade;
    }

    public int getDeptNumberByParentId(String parentId) {
        return singleDao.queryOne("DeptDaoMapper.getDeptNumberByParentId", parentId);
    }

    /**
     * 更新上级机构的节点状态
     *
     * @param id     上级机构id
     * @param isLeaf 是否是叶子节点
     */
    public void updateDeptLeaf(String id, boolean isLeaf) {
        Dept dept = new Dept();
        dept.setId(id);
        dept.setIsLeaf(isLeaf);
        singleDao.updateById(dept);
    }

    public void deleteDept(Dept dept) {
        dept.setCascade(dept.getCascade());
        Where wrapper = new Where("cascade_ like concat(#{cascade}, '%')");
        singleDao.delete(dept, wrapper);
    }

    public int getDeptUserCount(Dept dept) {
        return singleDao.queryOne("DeptDaoMapper.getDeptUserCount", dept);
    }
}
